package com.ruoyi.system.service.impl;

import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.exception.GlobalException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.system.domain.GwTemplate;
import com.ruoyi.system.dto.ThirdTemplateDTO;
import com.ruoyi.system.mapper.GwEnterpriseInfoMapper;
import com.ruoyi.system.mapper.GwTemplateMapper;
import com.ruoyi.system.service.IGwTemplateService;
import com.ruoyi.system.utils.AgentUtil;
import com.tencent.essbasic.api.OperateChannelTemplate;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.essbasic.v20210526.EssbasicClient;
import com.tencentcloudapi.essbasic.v20210526.models.DescribeTemplatesRequest;
import com.tencentcloudapi.essbasic.v20210526.models.DescribeTemplatesResponse;
import com.tencentcloudapi.essbasic.v20210526.models.TemplateInfo;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import static com.tencent.essbasic.common.CreateFlowUtils.initClient;

/**
 * 合同模版管理Service业务层处理
 *
 * @author ruoyi
 * @date 2025-04-23
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class GwTemplateServiceImpl implements IGwTemplateService {
    @Resource
    private GwTemplateMapper gwTemplateMapper;
    @Resource
    private GwEnterpriseInfoMapper gwEnterpriseInfoMapper;
    @Resource
    private AgentUtil agentUtil;

    /**
     * 查询合同模版管理
     *
     * @param id 合同模版管理主键
     * @return 合同模版管理
     */
    @Override
    public GwTemplate selectGwTemplateById(String id) {
        return gwTemplateMapper.selectGwTemplateById(id);
    }

    /**
     * 查询合同模版管理列表
     *
     * @param gwTemplate 合同模版管理
     * @return 合同模版管理
     */
    @Override
    public List<GwTemplate> selectGwTemplateList(GwTemplate gwTemplate) {
        //设置公司ID
        System.out.println("-----applet login enterpriseId:" + SecurityUtils.getLoginUser().getEnterpriseId() + "-------------------");
        String companyId = ObjectUtils.isNotEmpty(SecurityUtils.getLoginUser().getEnterpriseId()) ? SecurityUtils.getLoginUser().getEnterpriseId() : "-1";
        gwTemplate.setCompanyId(companyId);
        //企业管理员看公司的
        if (!"1".equals(SecurityUtils.getLoginUser().getUser().getUserType())) {
            //其他人看自己创建的
            gwTemplate.setCreateBy(SecurityUtils.getLoginUser().getUser().getNickName());
        }
        return gwTemplateMapper.selectGwTemplateList(gwTemplate);
    }

    /**
     * 新增合同模版管理
     *
     * @param gwTemplate 合同模版管理
     * @return 结果
     */
    @Override
    public int insertGwTemplate(GwTemplate gwTemplate) throws IOException, TencentCloudSDKException {
        // 上传模板 腾讯电子签没有新建模板的接口，所以公司新建的模板也就是跟通过文件创建流程是一样的？
        // 设置公司ID
        if (ObjectUtils.isEmpty(SecurityUtils.getLoginUser().getEnterpriseId())) {
            throw new GlobalException("未知的公司,请绑定公司再进行操作");
        }
        gwTemplate.setCompanyId(SecurityUtils.getLoginUser().getEnterpriseId());
        String[] split = gwTemplate.getTemplateName().split("_");
        gwTemplate.setTemplateName(split[0]);
        //gwTemplate.setId(IdUtils.fastSimpleUUID());
        gwTemplate.setCreateTime(DateUtils.getNowDate());
        gwTemplate.setCreateBy(SecurityUtils.getLoginUser().getUser().getNickName());
        gwTemplate.setUpdateTime(DateUtils.getNowDate());
        gwTemplate.setUpdateBy(SecurityUtils.getLoginUser().getUser().getNickName());
        return gwTemplateMapper.insertGwTemplate(gwTemplate);
    }

    /**
     * 修改合同模版管理
     *
     * @param gwTemplate 合同模版管理
     * @return 结果
     */
    @Override
    public int updateGwTemplate(GwTemplate gwTemplate) throws IOException, TencentCloudSDKException {
//        GwTemplate gwTemplate1 = gwTemplateMapper.selectGwTemplateById(gwTemplate.getId());
//        if(ObjectUtils.isNotEmpty(gwTemplate1) && !gwTemplate1.getTemplateUrl().equals(gwTemplate.getTemplateUrl())){
//            //先删除
//            gwTemplateMapper.deleteGwTemplateById(gwTemplate.getId());
//            //再新建
//            insertGwTemplate(gwTemplate);
//            return 1;
//        }
        gwTemplate.setUpdateTime(DateUtils.getNowDate());
        gwTemplate.setUpdateBy(SecurityUtils.getLoginUser().getUser().getNickName());
        return gwTemplateMapper.updateGwTemplate(gwTemplate);
    }

    /**
     * 批量删除合同模版管理
     *
     * @param ids 需要删除的合同模版管理主键
     * @return 结果
     */
    @Override
    public int deleteGwTemplateByIds(String[] ids) {
        return gwTemplateMapper.deleteGwTemplateByIds(ids);
    }

    /**
     * 删除合同模版管理信息
     *
     * @param id 合同模版管理主键
     * @return 结果
     */
    @Override
    public int deleteGwTemplateById(String id) {
        return gwTemplateMapper.deleteGwTemplateById(id);
    }

    @Override
    public AjaxResult getThirdTemplateList(ThirdTemplateDTO thirdTemplateDTO) throws TencentCloudSDKException {
        // 实例化一个client
        EssbasicClient client = initClient();
        // 实例化一个请求对象,每个接口都会对应一个request对象
        DescribeTemplatesRequest req = new DescribeTemplatesRequest();
        req.setAgent(agentUtil.setAgent());
        req.setLimit(thirdTemplateDTO.getLimit());
        req.setOffset(thirdTemplateDTO.getOffset() - 1);
        req.setTemplateName(thirdTemplateDTO.getTemplateName());
        req.setQueryAllComponents(false);
        req.setUserFlowTypeId(thirdTemplateDTO.getUserFlowTypeId());
        DescribeTemplatesResponse describeTemplatesResponse = client.DescribeTemplates(req);
        TemplateInfo[] templates = describeTemplatesResponse.getTemplates();
        if (ObjectUtils.isNotEmpty(templates)) {
            describeTemplatesResponse.setTemplates(Arrays.stream(templates).filter(t -> 1 == t.getAvailable()).toArray(TemplateInfo[]::new));
        }
        return AjaxResult.success(describeTemplatesResponse);
    }

    @Override
    public AjaxResult getThirdTemplateListNoPage(ThirdTemplateDTO thirdTemplateDTO) throws TencentCloudSDKException {
        // 实例化一个client
        EssbasicClient client = initClient();
        // 实例化一个请求对象,每个接口都会对应一个request对象
        DescribeTemplatesRequest req = new DescribeTemplatesRequest();
        req.setAgent(agentUtil.setAgent());
        req.setLimit(100L);
        req.setOffset(0L);
        req.setQueryAllComponents(false);
        req.setUserFlowTypeId(thirdTemplateDTO.getUserFlowTypeId());
        req.setTemplateName(thirdTemplateDTO.getTemplateName());
        DescribeTemplatesResponse describeTemplatesResponse = client.DescribeTemplates(req);
        TemplateInfo[] templates = describeTemplatesResponse.getTemplates();

        if (ObjectUtils.isNotEmpty(templates)) {
            templates = Arrays.stream(templates).filter(t -> 1 == t.getAvailable()).toArray(TemplateInfo[]::new);
        }

        //计算页数
        Long totalCount = describeTemplatesResponse.getTotalCount();
        if (totalCount > 100) {
            //页数
            long l = (totalCount % 100) == 0L ? totalCount / 100 : totalCount / 100 + 1;
            for (int i = 1; i <= l - 1; i++) {
                TemplateInfo[] thirdTemplate = getThirdTemplate(i, thirdTemplateDTO.getUserFlowTypeId(), thirdTemplateDTO.getTemplateName());
                templates = ArrayUtils.addAll(templates, thirdTemplate);
            }
        }

        if (ObjectUtils.isNotEmpty(templates)) {
            if (ObjectUtils.isNotEmpty(thirdTemplateDTO.getSystemType())) {
                if ("平台".equals(thirdTemplateDTO.getSystemType())) {
                    templates = Arrays.stream(templates).filter(t -> ObjectUtils.isNotEmpty(t.getChannelTemplateId())).toArray(TemplateInfo[]::new);
                } else {
                    templates = Arrays.stream(templates).filter(t -> ObjectUtils.isEmpty(t.getChannelTemplateId())).toArray(TemplateInfo[]::new);
                }
            }
        }
        return AjaxResult.success(templates);
    }

    @Override
    public int thirdRemove(String[] ids) {
        for (String id : ids) {
            OperateChannelTemplate.operateChannelTemplate(agentUtil.setAgent(), id, "DELETE");
        }
        return ids.length;
    }

    @Override
    public AjaxResult authenticationOrConsole() {
        return AjaxResult.success(agentUtil.setACAgent());
    }

    public TemplateInfo[] getThirdTemplate(long offset, String userFlowTypeId, String templateName) throws TencentCloudSDKException {
        // 实例化一个client
        EssbasicClient client = initClient();
        // 实例化一个请求对象,每个接口都会对应一个request对象
        DescribeTemplatesRequest req = new DescribeTemplatesRequest();
        req.setAgent(agentUtil.setAgent());
        req.setLimit(100L);
        req.setOffset(offset);
        req.setQueryAllComponents(false);
        req.setUserFlowTypeId(userFlowTypeId);
        req.setTemplateName(templateName);
        DescribeTemplatesResponse describeTemplatesResponse = client.DescribeTemplates(req);

        TemplateInfo[] templates = describeTemplatesResponse.getTemplates();
        if (ObjectUtils.isNotEmpty(templates)) {
            templates = Arrays.stream(templates).filter(t -> 1 == t.getAvailable()).toArray(TemplateInfo[]::new);
        }
        return templates;
    }

}
